package com.example.lists;

import com.google.common.collect.Lists;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * 均分list
 */
public class ListPartition {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        for(int i=0; i<50; i++){
            list.add(i);
        }
        //第一种拆分，Lists 提供的静态方法
        List<List<Integer>> allList = Lists.partition(list, 9);
        for(List<Integer> outList : allList){
            System.out.print(outList.size());
            System.out.print("[");
            for(Integer integer : outList){
                System.out.print(integer+",");
            }
            System.out.println("]");
        }

        /*
            第二种拆分，stream:skip + limit 组合使用
            skip()方法用于跳过前面n个元素，然后再返回新的流
            （1）当n<0时，抛IllegalArgumentException异常；
            （2）当n=0时，相当没有跳过任何元素，原封不动、完璧归赵；
            （3）当0<n<length时，跳过n个元素后，返回含有剩下的元素的流；
            （4）当n>=length时，跳过所有元素，返回空流。

            limit()方法，它是用于限制流中元素的个数，即取前n个元素，返回新的流
            （1）当n<0时，抛IllegalArgumentException异常；
            （2）当n=0时，不取元素，返回空流；
            （3）当0<n<length时，取前n个元素，返回新的流；
            （4）当n>=length时，取所有元素，原封不动、完璧归赵。
         */
        System.out.println("-------------------------------------------------");
        List<List<Integer>> otherList = list.stream()
                .map(m -> list.stream()
                        .skip(m * 9)
                        .limit(9)
                        .collect(Collectors.toList()))
                .filter(f -> !f.isEmpty())
                .collect(Collectors.toList());
        for(List<Integer> outList : otherList){
            System.out.print(outList.size());
            System.out.print("[");
            for(Integer integer : outList){
                System.out.print(integer+",");
            }
            System.out.println("]");
        }

        System.out.println("-------------------------------------------------");
        //第三种拆分，用新集合获取流，先计算出分割后的大小=(size + 每个集合数量 - 1)/每个集合数量
        int maxSize = (list.size() + 9 - 1) / 9;
        List<List<Integer>> newList = Stream.iterate(0, s -> s+1)
                .limit(maxSize)
                .map(m -> list.stream()
                        .skip(m * 9)
                        .limit(9)
                        .collect(Collectors.toList()))
                .collect(Collectors.toList());
        for(List<Integer> outList : newList){
            System.out.print(outList.size());
            System.out.print("[");
            for(Integer integer : outList){
                System.out.print(integer+",");
            }
            System.out.println("]");
        }
    }

}
